package br.gov.df.emater.web.mb;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.FlowEvent;
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.TreeNode;
import org.primefaces.model.map.LatLng;

@ManagedBean
@ViewScoped
public class PessoasMB implements Serializable {

	public class Pessoa implements Serializable {

		private static final long serialVersionUID = 1L;
		private String apelidoSigla;
		private String cpfCnpj;
		private Long id;
		private String nome;
		private String outrasInformacoes;
		private String setores;
		private String tipo;

		public Pessoa() {
			this.id = (long) (1000 * Math.random());
		}

		public Pessoa(Long id, String nome, String apelidoSigla,
				String cpfCnpj, String setores, String outrasInformacoes,
				String tipo) {
			super();
			this.id = id;
			this.nome = nome;
			this.apelidoSigla = apelidoSigla;
			this.cpfCnpj = cpfCnpj;
			this.setores = setores;
			this.outrasInformacoes = outrasInformacoes;
			this.tipo = tipo;
		}

		public String getApelidoSigla() {
			return apelidoSigla;
		}

		public String getCpfCnpj() {
			return cpfCnpj;
		}

		public Long getId() {
			return id;
		}

		public String getNome() {
			return nome;
		}

		public String getOutrasInformacoes() {
			return outrasInformacoes;
		}

		public String getSetores() {
			return setores;
		}

		public String getTipo() {
			return tipo;
		}

		public void setApelidoSigla(String apelidoSigla) {
			this.apelidoSigla = apelidoSigla;
		}

		public void setCpfCnpj(String cpfCnpj) {
			this.cpfCnpj = cpfCnpj;
		}

		public void setId(Long id) {
			this.id = id;
		}

		public void setNome(String nome) {
			this.nome = nome;
		}

		public void setOutrasInformacoes(String outrasInformacoes) {
			this.outrasInformacoes = outrasInformacoes;
		}

		public void setSetores(String setores) {
			this.setores = setores;
		}

		public void setTipo(String tipo) {
			this.tipo = tipo;
		}
	}

	private static Logger logger = Logger.getLogger(PessoasMB.class.getName());

	private static final long serialVersionUID = 1L;

	private StreamedContent foto;

	private TreeNode grupos;

	private List<Pessoa> pessoas = new ArrayList<Pessoa>();

	private List<Pessoa> pessoasEncontradas = new ArrayList<Pessoa>();

	private TreeNode selectedGrupo;

	private Pessoa selectedPessoa = new Pessoa();
	private boolean skip;

	public void filtrar() {
		init();
	}

	public StreamedContent getFoto() {
		return foto;
	}

	@SuppressWarnings("unused")
	public TreeNode getGrupos() {
		if (grupos == null) {
			grupos = new DefaultTreeNode("Root", null);
			TreeNode node0 = new DefaultTreeNode("Node 0", grupos);
			TreeNode node1 = new DefaultTreeNode("Node 1", grupos);
			TreeNode node2 = new DefaultTreeNode("Node 2", grupos);

			TreeNode node00 = new DefaultTreeNode("Node 0.0", node0);
			TreeNode node01 = new DefaultTreeNode("Node 0.1", node0);

			TreeNode node10 = new DefaultTreeNode("Node 1.0", node1);
			TreeNode node11 = new DefaultTreeNode("Node 1.1", node1);

			TreeNode node000 = new DefaultTreeNode("Node 0.0.0", node00);
			TreeNode node001 = new DefaultTreeNode("Node 0.0.1", node00);
			TreeNode node010 = new DefaultTreeNode("Node 0.1.0", node01);

			TreeNode node100 = new DefaultTreeNode("Node 1.0.0", node10);
		}
		return grupos;
	}

	public List<Pessoa> getPessoas() {
		return pessoas;
	}

	public List<Pessoa> getPessoasEncontradas() {
		return pessoasEncontradas;
	}

	public TreeNode getSelectedGrupo() {
		return selectedGrupo;
	}

	public Pessoa getSelectedPessoa() {
		// FIXME esta instanciação é só para teste e deve ser removido
		// futuramente
		if (selectedPessoa == null) {
			selectedPessoa = new Pessoa();
		}
		return selectedPessoa;
	}

	@PostConstruct
	public void init() {
		pessoas.add(new Pessoa(1l, "João da Silva", "João", "999.333.111-33",
				"Empreendedor Familiar", "Agricultura, Pecuária",
				"img:farmer-icon.gif"));
		pessoas.add(new Pessoa(2l, "Maria Pereira", "Maria", "229.113.144-32",
				"Empreendedor Patronal", "Pecuária", "img:farmer-icon.gif"));
		pessoas.add(new Pessoa(3l, "José Souza", "Zé", "229.333.111-33",
				"Empreendedor Familiar", "Agricultura", "img:farmer-icon.gif"));
		pessoas.add(new Pessoa(4l, "Joaquim Feliciano", "Feliciano",
				"229.222.144-32", "Empreendedor Patronal", "Pecuária",
				"img:businessman-icon.gif"));
		pessoas.add(new Pessoa(5l, "Claudio Luiz", "Claúdio", "999.111.111-33",
				"Empreendedor Familiar", "Agricultura, Pecuária",
				"img:farmer-icon.gif"));
		pessoas.add(new Pessoa(6l, "Fernando Augusto", "Fernando",
				"229.113.144-32", "Empreendedor Patronal", "Pecuária",
				"img:businessman-icon.gif"));

		pessoasEncontradas.add(new Pessoa(1l, "João da Silva", "João",
				"999.333.111-33", "Empreendedor Familiar",
				"Agricultura, Pecuária", "img:farmer-icon.gif"));
		pessoasEncontradas.add(new Pessoa(2l, "Maria Pereira", "Maria",
				"229.113.144-32", "Empreendedor Patronal", "Pecuária",
				"img:farmer-icon.gif"));
		pessoasEncontradas.add(new Pessoa(3l, "José Souza", "Zé",
				"229.333.111-33", "Empreendedor Familiar", "Agricultura",
				"img:farmer-icon.gif"));
		// icones copiados do site
		// http://www.vista-style-icons.com/libs/people-vista/geisha.htm
	}

	public boolean isSkip() {
		return skip;
	}

	public String onFlowProcess(FlowEvent event) {
		logger.info("Passo atual no wizard:" + event.getOldStep());
		logger.info("Próximo passo:" + event.getNewStep());

		FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_FATAL,
				"Registros parecidos encontrados",
				"Alguns registros são parecidos com os dados informados");

		FacesContext.getCurrentInstance().addMessage(null, msg);

		if (skip) {
			skip = false; // reset in case user goes back
			return "confirmation";
		} else {
			return event.getNewStep();
		}
	}

	public void pontoSelecionado(PointSelectEvent event) {
		LatLng latituteLongitude = event.getLatLng();
		FacesContext.getCurrentInstance().addMessage(
				null,
				new FacesMessage(FacesMessage.SEVERITY_INFO,
						"Ponto selecionado", "Lat:"
								+ latituteLongitude.getLat() + ", Long:"
								+ latituteLongitude.getLng()));
	}

	public void save(ActionEvent actionEvent) {
		// Persist user
		FacesMessage msg = new FacesMessage("Sucesso", "Bem vindo:"
				+ selectedPessoa.getNome());
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void setFoto(StreamedContent foto) {
		this.foto = foto;
	}

	public void setPessoas(List<Pessoa> pessoas) {
		this.pessoas = pessoas;
	}

	public void setPessoasEncontradas(List<Pessoa> pessoasEncontradas) {
		this.pessoasEncontradas = pessoasEncontradas;
	}

	public void setSelectedGrupo(TreeNode selectedGrupo) {
		this.selectedGrupo = selectedGrupo;
	}

	public void setSelectedPessoa(Pessoa selectedPessoa) {
		this.selectedPessoa = selectedPessoa;
	}

	public void setSkip(boolean skip) {
		this.skip = skip;
	}

	public void upload(FileUploadEvent event) {
		try {
			foto = new DefaultStreamedContent(event.getFile().getInputstream());

			FacesMessage msg = new FacesMessage("Success! ", event.getFile()
					.getFileName() + " is uploaded.");
			FacesContext.getCurrentInstance().addMessage(null, msg);

			// Do what you want with the file
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
